package persistencia;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

import entidades.Perfil;

/**
 * Classe que contem os metodos de persistencia da Entidade Perfil.
 * 
 * @author Lino Bordin e Lucas Pessoa
 *
 */
public class PerfilDAO{

	public final String COLUNA_PERFIL_NOME = "nome";
	public final String ID = "idPerfil";
	
	/**
	 * Sessao responsavel por realizar todas as transacoes com o o banco de
	 * dados utilizando o framework hibernate
	 */
	private SessionFactory factory;

	public SessionFactory getFactory() {
		return factory;
	}

	public void setFactory(SessionFactory factory) {
		this.factory = factory;
	}
	
	/**
	 * Encontra um determinado perfil
	 * 
	 * @param String nomePerfil do perfil a ser encontrado
	 * @return Perfil
	 */
	public Perfil findPerfil(String nomePerfil) {

		Session session = factory.getCurrentSession();
		Criteria criteria = session.createCriteria(Perfil.class);
		criteria.add(Restrictions.like(this.COLUNA_PERFIL_NOME, nomePerfil));
		Perfil p = new Perfil();
		p = (Perfil) criteria.uniqueResult();
		return p;
		
	}
	
	/**
	 * Salva um determinado perfil
	 * 
	 * @param Perfil perfil a ser salvo
	 * @return void
	 */
	public void save(Perfil perfil) {
		
		Session session = factory.getCurrentSession();
		
		if (perfil != null) {
			
			session.save(perfil);
			
		}

	}
	
	/**
	 * Atualiza dados de um perfil
	 * 
	 * @param Perfil com dados do perfil
	 * @return void
	 */
	public void update(Perfil perfil) {
		
		Session session = factory.getCurrentSession();
		
		if (perfil != null) {
			
			session.update(perfil);

		}
		return;

	}
	
	/**
	 * Apaga um determinado perfil
	 * 
	 * @param int idPerfil do Perfil a ser apagado
	 * @return void
	 */
	public void delete(int idPerfil) {
		
		Session session = factory.getCurrentSession();
		Perfil perfil = new Perfil();

		Criteria criteria = session.createCriteria(Perfil.class);
		criteria.add(Restrictions.like(this.ID, idPerfil));
		
		perfil = (Perfil) criteria.list().get(0);
		session.delete(perfil);
		
	}
	
	/**
	 * Lista todos os perfis existentes no banco.
	 * 
	 * @return ArrayList<Perfil>
	 */
	@SuppressWarnings("unchecked")
	public List<Perfil> listAllProfiles() {

		Session session = factory.getCurrentSession();
		Criteria criteria = session.createCriteria(Perfil.class);
		
		return criteria.list();

	}
}
